package com.atao.example.function01;

import java.util.function.BiFunction;
import java.util.function.Consumer;

/**
 * @author 阿涛
 * @date 2021-03-06
 */
public class Test {

    //todo 若lambda体中的内容有方法已经实现了，那么可以使用“方法引用”
    // 也可以理解为方法引用是lambda表达式的另外一种表现形式并且其语法比lambda表达式更加简单
    // 三种表现形式：
    // 1. 对象::实例方法名
    // 2. 类::静态方法名
    // 3. 类::实例方法名 （lambda参数列表中第一个参数是实例方法的调用者，第二个参数是实例方法的参数时 可用）

    public static void main(String[] args) {
        /**
         * 注意：
         *      1.lambda体中调用方法的参数列表与返回值类型，要与函数式接口中抽象方法的函数列表和返回值类型保持一致！
         *      2.若lambda参数列表中的第一个参数是实例方法的调用者，而第二个参数是实例方法的参数时，可以使用ClassName::method
         */
        Consumer<Integer> con = (x) -> System.out.println(x);
        con.accept(100);

        //todo 方法引用-对象::实例方法
        Consumer<Integer> con2 = System.out::println;
        con2.accept(200);

        //todo 方法引用-类名::静态方法名
        BiFunction<Integer, Integer, Integer> biFun = (x, y) -> Integer.compare(x, y);
        BiFunction<Integer, Integer, Integer> biFun2 = Integer::compare;
        Integer result = biFun2.apply(100, 200);
        System.out.println(result);

        //todo 方法引用-类名::实例方法名
        BiFunction<String, String, Boolean> fun1 = (x, y) -> x.equals(y);
        BiFunction<String, String, Boolean> fun2 = String::equals;
        Boolean result2 = fun2.apply("hello", "world");
        System.out.println(result2);

    }

}
